package com.cctc.config.initializer;

import com.cctc.SpringWebApplication;
import jakarta.servlet.Filter;
import jakarta.servlet.MultipartConfigElement;
import jakarta.servlet.ServletRegistration;
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.filter.HiddenHttpMethodFilter;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

/**
 * @Name CctcAnnotationWebApplicationInitializer
 * @Description: 注册并初始化 DispatcherServlet 容器
 * @Author: lichao
 * @Email: li2chao@126.com
 * @Date: 2024-01-23 15:26:45
 **/
public class CctcAnnotationWebApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        // Root WebApplicationContext 容器
        return new Class<?>[]{SpringWebApplication.class};
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        // Servlet WebApplicationContext 容器，不需要 [子 Web + 根 Web] 层次结构, 即默认使用根 Web 容器配置
        return new Class<?>[]{SpringWebApplication.class};
    }

    @Override
    protected void customizeRegistration(ServletRegistration.Dynamic registration) {
        /**
         * 1. 配置 Http 表单请求类
         * [MultipartHttpServletRequest] 当收到一个内容类型为 multipart/form-data 的 POST 时，将内容包裹在当前的 HttpServletRequest 中，作为一个 MultipartHttpServletRequest 来提供对解析文件的访问。
         * public MultipartConfigElement(String location, long maxFileSize, long maxRequestSize, int fileSizeThreshold)
         */
        registration.setMultipartConfig(new MultipartConfigElement("/tmp"));
        /**
         * 2. 启动敏感数据的日志记录
         * [敏感数据] 请求参数和 header 信息在默认情况下是被屏蔽的。
         * 它们的完整记录必须通过 DispatcherServlet 上的 enableLoggingRequestDetails 属性明确启用。
         */
        registration.setInitParameter("enableLoggingRequestDetails", "true");
        registration.setLoadOnStartup(1);
        registration.addMapping("/");
    }

    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }

    @Override
    protected Filter[] getServletFilters() {
        return new Filter[]{new HiddenHttpMethodFilter(), new CharacterEncodingFilter()};
    }

    @Override
    protected boolean isAsyncSupported() {
        return true;
    }

    // ... DispatcherServlet 容器其他配置 ...

}

